/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package app.web;

import app.modelo.Libro;
import app.negocio.Carrito;
import app.negocio.GestionLibreria;
import app.negocio.LibroNoEncontradoException;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Johann
 */
public class ServletControlador extends HttpServlet {

    private GestionLibreria gestionLibreria;

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        String vista = "";
        if (request.getParameter("op") != null) {
            gestionLibreria = new GestionLibreria();

            String opcion = request.getParameter("op");
            switch (opcion) {
                case "1":
                    vista = altaLibro(request);
                    break;
                case "2":
                    vista = consultarTodosLibros(request);
                    break;
                case "3":
                    vista = eliminarLibro(request);
                    break;
                case "4":
                    vista = buscarLibroPorISBN(request);
                    break;
                case "5":
                    vista = modificarPrecioLibro(request);
                    break;
                case "6":
                    vista = buscarLibroTitulo(request);
                    break;
                case "7":
                    vista = anadirCarrito(request);
                    break;
                case "8":
                    vista = sacarDeCarrito(request);
                    break;
                    case "9":
                    vista = comprar(request);
                    break;
                case "99":
                    vista = "/index.jsp";
                    break;
            }
        }

        // El servlet elige la vista que mostrar el rsultado
        RequestDispatcher rd = request.getRequestDispatcher(vista);

        // El sevlet redirige hacia la vista elegida
        rd.forward(request, response);
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    /**
     * Método que permite dar de alta un libro.
     * @param request
     * @return 
     */
    private String altaLibro(HttpServletRequest request) {
        String vistaRespuesta = "/index.jsp";
        //Se añade los datos de la request en una instancia de la clase Libro.
        Libro libro = new Libro();
        libro.setAutor(request.getParameter("autor"));
        libro.setDescripcion(request.getParameter("descripcion"));
        libro.setEditorial(request.getParameter("editorial"));
        libro.setIsbn(request.getParameter("isbn"));
        libro.setPrecio(Double.parseDouble(request.getParameter("precio")));
        libro.setPublicacion(Integer.parseInt(request.getParameter("publicacion")));
        libro.setTitulo(request.getParameter("titulo"));
        //Llamamos al método de alta de libro, si ha ido todo correctamente, 
        //mostramos un mensaje si ha ido bien o no.
        if (gestionLibreria.altaLibro(libro)) {
            request.setAttribute("libroAltaOK", "Libro insertado correctamente");
            request.setAttribute("libroAltaKO", null);
            //vistaRespuesta = "/index.jsp";
        } else {
            request.setAttribute("libroAltaKO", "No se ha podido insertar el libro.");
            request.setAttribute("libroAltaOK", null);
            //vistaRespuesta = "/mensajeError.jsp";
        }
        return vistaRespuesta;
    }

    /**
     * Método que consulta todos los libros en la BD.
     * @param request
     * @return 
     */
    private String consultarTodosLibros(HttpServletRequest request) {
        String vistaRespuesta = null;
        List<Libro> libros = gestionLibreria.consultarTodos();
        request.setAttribute("libros", libros);
        vistaRespuesta = "/mostrarTodos.jsp";
        return vistaRespuesta;
    }

    /**
     * Método que elimina un libro. Una vez que se ha eliminado un libro se 
     * realiza una llamada al método que lista a todos los libros.
     * @param request
     * @return 
     */
    private String eliminarLibro(HttpServletRequest request) {
        String vistaRespuesta = null;
        String eliminar = request.getParameter("eliminar");
        if (eliminar != null && eliminar.equals(Utils.SI)) {
            Integer id = Integer.parseInt(request.getParameter("id"));
            if (gestionLibreria.eliminarLibro(id)) {
                request.setAttribute("libroEliminadoOK", "Libro eliminado correctamente");
                request.setAttribute("libroEliminadoKO", null);
            } else {
                request.setAttribute("libroEliminadoKO", "No se ha podido eliminar el libro.");
                request.setAttribute("libroEliminadoOK", null);
            }
            request.setAttribute("mostrarEliminar", "si");
            vistaRespuesta = consultarTodosLibros(request);
        } else {
            request.setAttribute("mostrarEliminar", "si");
            vistaRespuesta = consultarTodosLibros(request);
        }

        return vistaRespuesta;
    }

    /**
     * Método que realiza una búsqueda de libros a través de su ISBN.
     * @param request
     * @return 
     */
    private String buscarLibroPorISBN(HttpServletRequest request) {
        String vistaRespuesta = "";
        if (request.getParameter("modificarPrecio") != null){
            vistaRespuesta = "/controladorLibreria?op=5"; 
        }else {
            vistaRespuesta = "/buscarLibroPorISBN.jsp";
        }
        
        if (request.getParameter("isbn") != null) {
            try {
                Libro libro = gestionLibreria.consultarISBN(request.getParameter("isbn"));
                request.setAttribute("libro", libro);
                if (request.getParameter("modificarPrecio") != null) {
                    request.setAttribute("modificar", this);
                                       
                }
            } catch (LibroNoEncontradoException ex) {                
                request.setAttribute("libroNoEncontrado", ex.getMessage());
            }
        }
        return vistaRespuesta;
    }

    /**
     * Método que realiza una modificación del precio del libro indicado en la request.
     * @param request
     * @return 
     */
    private String modificarPrecioLibro(HttpServletRequest request) {
        String vistaRespuesta = "/buscarLibroPorISBN.jsp";
        if (request.getParameter("modificarPrecio") != null
                && request.getParameter("isbn") != null
                && request.getParameter("precio") != null) {
            if (gestionLibreria.modificarPrecio(request.getParameter("isbn"),
                    Double.parseDouble(request.getParameter("precio")))) {
                request.setAttribute("libroModificadoOK", "El precio del libro ha sido modificado correctamente");
                buscarLibroPorISBN(request);
            } else {
                request.setAttribute("libroModificadoKO", "ERROR: El libro no ha sido modificado");
            }
        }
        request.setAttribute("modificar", this);
        return vistaRespuesta;
    }

    /**
     * Método que realiza una consulta de los libros por el título del mismo.
     * @param request
     * @return 
     */
    private String buscarLibroTitulo(HttpServletRequest request) {
        String vistaRespuesta = "/buscarLibroTitulo.jsp";
        if (request.getParameter("titulo") != null) {
            try {
                List<Libro> libros = gestionLibreria.consultarTitulo(request.getParameter("titulo"));
                request.setAttribute("libros", libros);
            } catch (LibroNoEncontradoException ex) {
                request.setAttribute("libroNoEncontrado", ex.getMessage());
            }
        }

        return vistaRespuesta;
    }

    /**
     * Método que añade un elemento al carrito. Dependiendo de la sesión del
     * usuario, creará o actualizará el carrito.
     *
     * @param request
     * @return
     */
    private String anadirCarrito(HttpServletRequest request) {
        // Crear o recuperar la sesion del usuario
        HttpSession sesion = request.getSession();
        // Recuperar el carrito
        Carrito miCarro = (Carrito) sesion.getAttribute("carrito");
        // Si acabamos de crear la sesion el carrito no existe
        if (miCarro == null) {
            miCarro = new Carrito();
            sesion.setAttribute("carrito", miCarro);
        }
        //Recuperamos el identificador del elemento que será el isbn.
        String isbn = request.getParameter("isbn");
        Libro encontrado;
        try {
            encontrado = gestionLibreria.consultarISBN(isbn);
            miCarro.agregarLibro(encontrado);
        } catch (LibroNoEncontradoException ex) {
            Logger.getLogger(ServletControlador.class.getName()).log(Level.SEVERE, null, ex);
        }
        //Variable para alterar el comportamiento del botón volver
        request.setAttribute("venimosDeAnadirCarrito", "SI");
        return "/mostrarCarrito.jsp";
    }

    /**
     * Método que saca un elemento al carrito.
     *
     * @param request
     * @return
     */
    private String sacarDeCarrito(HttpServletRequest request) {
        // Recuperar la sesion del usuario
        HttpSession sesion = request.getSession(false);
        // Recuperar el carrito
        Carrito miCarro = (Carrito) sesion.getAttribute("carrito");
        String isbn = request.getParameter("isbn");
        Libro encontrado;
        try {
            encontrado = gestionLibreria.consultarISBN(isbn);
            miCarro.eliminarLibro(encontrado);
        } catch (LibroNoEncontradoException ex) {
            Logger.getLogger(ServletControlador.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "/mostrarCarrito.jsp";
    }

    
    /**
     * Método que elimina de la sesión el atriburo carrito.
     *
     * @param request
     * @return
     */
    private String comprar(HttpServletRequest request) {
       // Crear o recuperar la sesion del usuario
        HttpSession sesion = request.getSession();
        // Eliminamos la sesión
        sesion.removeAttribute("carrito");
        request.setAttribute("compraRealizada", "La compra se ha realizado correctamente.");
        return "/index.jsp";
    }
}